package io.hilo.example.demo.metric;

import java.util.concurrent.TimeUnit;

import org.springframework.stereotype.Service;

import org.hilo.boot.core.UT;
import org.hilo.boot.core.spring.AsyncRunAfterStart;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;

/**
 * Timer(计时器)同时测量一个特定的代码逻辑块的调用(执行)速度和它的时间分布。
 * 简单来说，就是在调用结束的时间点记录整个调用块执行的总时间
 * ，适用于测量短时间执行的事件的耗时分布，例如消息队列消息的消费速率。
 * @author zollty
 * @since 2020年9月17日
 */
@Service
public class TimerService implements AsyncRunAfterStart {
    Timer timer;
    public TimerService(MeterRegistry registry) {
        timer = Timer.builder("app.timer").tag("app.tag.timer", "timersample")
                .description("timer sample test.").register(registry);
    }

    @Override
    public void doInit(Object[] args) {
//        Timer timer = Timer.builder("app.timer").tag("app.tag.timer", "timersample")
//                .description("timer sample test.").register(new SimpleMeterRegistry());

        for (int i = 1; i < 1000; i++) {
            UT.Thread.sleepThread(1000);
            final int k = i;
            timer.record(() -> {
                try {
                    TimeUnit.SECONDS.sleep(k%10);
                } catch (InterruptedException e) {
                }
            });
        }

        System.out.println(timer.count());
        System.out.println(timer.measure());
        System.out.println(timer.totalTime(TimeUnit.SECONDS));
        System.out.println(timer.mean(TimeUnit.SECONDS));
        System.out.println(timer.max(TimeUnit.SECONDS));
    }

}